/*******************************************************************************
*
*	:  IO
*
*******************************************************************************/
#define PORT_PIN_CTEAT
#include "bsp.h"
#include "bsp_io.h"
#include "iohandle.h"
#include "pincfg.h"
#include "mytype.h"


/*******************************************************************************
* @brief  gpio cfg list
*******************************************************************************/
static gpio_init_cfg_type gpio_cfg[] = {
	//LED
	{GPIOB, GPIO_Mode_Out_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_4},
	{GPIOB, GPIO_Mode_Out_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_5},
	{GPIOA, GPIO_Mode_Out_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_8},
	
	// KEY
	{GPIOA, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_4},
	{GPIOA, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_5},
	{GPIOA, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_6},
	
	//U1
	{GPIOA, GPIO_Mode_AF_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_9},
	{GPIOA, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_10},
	//U2
	{GPIOA, GPIO_Mode_AF_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_2},
	{GPIOA, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_3},
	//U3
	{GPIOB, GPIO_Mode_AF_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_10},
	{GPIOB, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_11},
	//U6
	{GPIOE, GPIO_Mode_AF_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_2},
	{GPIOE, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_3},
	
	//SPI2
	{GPIOB, GPIO_Mode_AF_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_13 | GPIO_PIN_15},
	{GPIOB, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_14},
	{GPIOB, GPIO_Mode_Out_PP, GPIO_Speed_50MHz,  1, GPIO_PIN_12},
	
	// LCD , DC 、 RST
	{GPIOE, GPIO_Mode_Out_PP, GPIO_Speed_50MHz,  1, GPIO_PIN_14},
	{GPIOE, GPIO_Mode_Out_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_15},
	
	//CAN2-remap
	{GPIOB, GPIO_Mode_AF_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_6},
	{GPIOB, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_5},
	//CAN1-ramap
	{GPIOB, GPIO_Mode_AF_PP, GPIO_Speed_50MHz,  0, GPIO_PIN_9},
	{GPIOB, GPIO_Mode_IPU, GPIO_Speed_50MHz,  0, GPIO_PIN_8},
	
};

/*******************************************************************************
* @brief  bsp_gpio_init
* \param[in] us delay
* \retval: none
*******************************************************************************/
void bsp_gpio_init(void)
{
	int index;

	// clock enable
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);
	
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOD, ENABLE);
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
	RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOF, ENABLE);

	// JATG disable, SWD enable
	GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_SW_ENABLE, ENABLE);
	
	// CAN pin remap
	GPIO_ConfigPinRemap(GPIO_RMP2_CAN1, ENABLE);
	GPIO_ConfigPinRemap(GPIO_RMP1_CAN2, ENABLE);
	
	/*gpio cfg*/
	for (index = 0; index < sizeof(gpio_cfg) / sizeof(gpio_init_cfg_type); index++)
	{
		GPIO_InitType GPIO_InitStruct;

		GPIO_InitStruct.Pin = gpio_cfg[index].pin;
		GPIO_InitStruct.GPIO_Mode = gpio_cfg[index].mode;
		GPIO_InitStruct.GPIO_Speed = gpio_cfg[index].speed;


		GPIO_InitPeripheral(gpio_cfg[index].port, &GPIO_InitStruct);

		if (gpio_cfg[index].mode == GPIO_Mode_Out_PP || gpio_cfg[index].mode == GPIO_Mode_Out_OD)
		{
			if (gpio_cfg[index].val_init)
			{
				GPIO_SetBits(gpio_cfg[index].port, gpio_cfg[index].pin);
			}
			else
			{
				GPIO_ResetBits(gpio_cfg[index].port, gpio_cfg[index].pin);
			}
		}
	}
}

/*******************************************************************************
* @brief  bsp_gpio
* \param[in] us delay
* \retval: none
*******************************************************************************/
void bsp_gpio_mode_out_pp(GPIO_Module *port, uint8_t pin)
{
	GPIO_InitType GPIO_InitStruct;	
	intx_alloc();

	intx_disable();

	GPIO_InitStruct.Pin = 1UL << pin;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(port, &GPIO_InitStruct);
	
	intx_enable();
}

void bsp_gpio_mode_out_od(GPIO_Module *port, uint8_t pin)
{
	GPIO_InitType GPIO_InitStruct;	
	intx_alloc();

	intx_disable();

	GPIO_InitStruct.Pin = 1UL << pin;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(port, &GPIO_InitStruct);
	
	intx_enable();
}

void bsp_gpio_mode_out_pp_spd(GPIO_Module *port, uint8_t pin, uint32_t spd)
{
	GPIO_InitType GPIO_InitStruct;	
	intx_alloc();

	intx_disable();

	GPIO_InitStruct.Pin = 1UL << pin;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(port, &GPIO_InitStruct);
	
	intx_enable();
}

void bsp_gpio_mode_out_od_spd(GPIO_Module *port, uint8_t pin, uint32_t spd)
{
	GPIO_InitType GPIO_InitStruct;	
	intx_alloc();

	intx_disable();

	GPIO_InitStruct.Pin = 1UL << pin;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(port, &GPIO_InitStruct);
	
	intx_enable();
}

void bsp_gpio_mode_in_up(GPIO_Module *port, uint8_t pin)
{
	GPIO_InitType GPIO_InitStruct;	
	intx_alloc();

	intx_disable();

	GPIO_InitStruct.Pin = 1UL << pin;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(port, &GPIO_InitStruct);
	
	intx_enable();
}

void bsp_gpio_mode_in_dn(GPIO_Module *port, uint8_t pin)
{
	GPIO_InitType GPIO_InitStruct;	
	intx_alloc();

	intx_disable();

	GPIO_InitStruct.Pin = 1UL << pin;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(port, &GPIO_InitStruct);
	
	intx_enable();
}

void bsp_gpio_mode_in_ft(GPIO_Module *port, uint8_t pin)
{
	GPIO_InitType GPIO_InitStruct;	
	intx_alloc();

	intx_disable();

	GPIO_InitStruct.Pin = 1UL << pin;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(port, &GPIO_InitStruct);
	
	intx_enable();
}

void bsp_gpio_mode_ain(GPIO_Module *port, uint8_t pin)
{
	GPIO_InitType GPIO_InitStruct;	
	intx_alloc();

	intx_disable();

	GPIO_InitStruct.Pin = 1UL << pin;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitPeripheral(port, &GPIO_InitStruct);
	
	intx_enable();
}

void bsp_gpio_mode_set(GPIO_Module *port, uint8_t pin, char pm)
{
	switch (pm)
	{
	case PIN_MODE_IN_UP:
	{
		bsp_gpio_mode_in_up(port, pin);
		break;
	}
	case PIN_MODE_IN_DN:
	{
		bsp_gpio_mode_in_dn(port, pin);
		break;
	}
	case PIN_MODE_IN_FLOAT:
	{
		bsp_gpio_mode_in_ft(port, pin);
		break;
	}
	case PIN_MODE_IN_AIN:
	{
		bsp_gpio_mode_ain(port, pin);
		break;
	};
	case PIN_MODE_OUT_SL_PP:
	{
		bsp_gpio_mode_out_pp_spd(port, pin, 2);
		break;
	}
	case PIN_MODE_OUT_SL_OD:
	{
		bsp_gpio_mode_out_od_spd(port, pin, 2);
		break;
	}
	case PIN_MODE_OUT_SM_PP:
	{
		bsp_gpio_mode_out_pp_spd(port, pin, 2);
		break;
	}
	case PIN_MODE_OUT_SM_OD:
	{
		bsp_gpio_mode_out_od_spd(port, pin, 2);
		break;
	}
	case PIN_MODE_OUT_SH_PP:
	{
		bsp_gpio_mode_out_pp_spd(port, pin, 1);
		break;
	}
	case PIN_MODE_OUT_SH_OD:
	{
		bsp_gpio_mode_out_od_spd(port, pin, 1);
		break;
	}
	default:
	{
		break;
	}
	}
}